package com.example.ad.sdk.domain.repositories

import com.alibaba.fastjson2.JSONObject
import com.example.ad.sdk.configs.EnvConfig
import com.example.ad.sdk.domain.helper.BuildConfigHelper
import com.example.ad.sdk.domain.helper.ContextHelper
import com.example.ad.sdk.domain.utils.AppDeviceUtil
import com.example.ad.sdk.domain.utils.AppInfoUtil


/**
 * ParamsHelper 是一个用于处理 API 请求参数的辅助类。
 * 该类提供了获取通用 API 参数的方法，并且通过单例模式确保线程安全。
 */
class ParamsHelper {
    companion object {
        /**
         * 通过懒加载模式获取 ParamsHelper 的单例实例。
         * 使用 SYNCHRONIZED 模式确保线程安全。
         */
        @JvmStatic
        val to: ParamsHelper by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
            ParamsHelper()
        }
    }

    /**
     * 为给定的 JSONObject 添加通用 API 参数，并返回包含这些参数的 JSONObject。
     *
     * @param jsonObject 可选的 JSONObject，如果为 null，则创建一个新的 JSONObject。
     * @return 包含通用 API 参数的 JSONObject。
     */
    fun apiCommonParams(jsonObject: JSONObject?): JSONObject {
        // 如果传入的 jsonObject 为 null，则创建一个新的 JSONObject
        val params = jsonObject ?: JSONObject()
        // TODO 获取通用 API 参数，并将其转换为 JSONObject
        // 将通用 API 参数添加到 params 中
        for ((key, value) in commonParams().entries) {
            params.put(key, value)
        }
        // 返回包含通用 API 参数的 JSONObject
        return params
    }

    private fun commonParams(): Map<String, Any> {
        val params = mutableMapOf<String, Any>()
        params["id"] = AppDeviceUtil.getUUID()
        params["sdkv"] = EnvConfig.sdkVersion
        params["timestamp"] = "${AppDeviceUtil.systemTimestamp()}"
        //设备信息
        params["device"] = getDeviceInfoParams()
        // app信息
        params["app"] = getAppInfoParams()
        return params
    }

    private fun getDeviceInfoParams(): Map<String, String> {
        val params = mutableMapOf<String, String>()
        params["os"] = "Android"
        params["osv"] = AppDeviceUtil.systemVersion()
        params["id"] = AppDeviceUtil.getUniqueDeviceId()
        params["model"] = AppDeviceUtil.systemModel()
        params["brand"] = AppDeviceUtil.deviceBrand()
        params["timeZone"] = AppDeviceUtil.getTimeZone()
        params["country"] = AppDeviceUtil.getCountry(ContextHelper.context)
        params["UA"] = AppDeviceUtil.getUserAgent(ContextHelper.context)
        params["oaid"] = BuildConfigHelper.getOAID()
        params["gaid"] = BuildConfigHelper.getGAID()
        val ips = AppDeviceUtil.getLocalIPs()
        params["ip"] = ips.component1() ?: ""
        params["ipv6"] = ips.component2() ?: ""
        return params
    }

    private fun getAppInfoParams(): Map<String, String> {
        val params = mutableMapOf<String, String>()
        params["appname"] = BuildConfigHelper.getAppName()
        params["apppackage"] = AppInfoUtil.getPackageName()
        params["appv"] = "${AppInfoUtil.getVersionCode()}"
        return params
    }

}
